package io.zhile.research.intellij.ier.common

import io.zhile.research.intellij.ier.common.EvalRecord.reset
import io.zhile.research.intellij.ier.common.Resetter
import io.zhile.research.intellij.ier.common.EvalRecord
import java.io.FilenameFilter
import io.zhile.research.intellij.ier.common.LicenseFileRecord
import io.zhile.research.intellij.ier.common.NormalFileRecord
import com.intellij.ide.util.PropertiesComponent
import com.intellij.ide.util.PropertiesComponentImpl
import io.zhile.research.intellij.ier.common.PropertyRecord
import io.zhile.research.intellij.ier.common.PreferenceRecord
import io.zhile.research.intellij.ier.helper.ReflectionHelper
import com.intellij.ide.plugins.IdeaPluginDescriptor
import com.intellij.ide.plugins.PluginManager
import io.zhile.research.intellij.ier.helper.NotificationHelper
import com.intellij.openapi.util.SystemInfo
import com.intellij.ide.Prefs
import java.util.prefs.BackingStoreException
import com.intellij.openapi.application.PathManager
import kotlin.Throws
import kotlin.jvm.JvmOverloads
import java.io.FileOutputStream
import java.io.DataInputStream
import java.io.FileInputStream
import java.lang.Exception
import java.util.prefs.Preferences

/**
 * Properties提供的应用程序解决方案主要存在两个问题：
 * （1）配置文件不能放在主目录中，因为某些OS（如Win9X）没有主目录的概念；
 * （2）没有标准的文件命名规则，存在文件名冲突的可能性。
 * Java中的Preferences类可以解决这些问题。Preferences提供一个存储配置信息的中心知识库，与平台无关。在Windows系统中，它存储在注册表中，在Linux中存储在本地文件系统中。它的实现是透明的，程序员无需深究它的底层是如何实现的。
 * Preferences的中心知识库是树状结构，因此可以避免文件名冲突。每个用户都有一棵树，存放与本用户有关的配置；还有一个系统树，存放全体用户的公共信息。内部的配置信息仍然以key-value的结构进行存储。
 *
 * 这个就是注册表信息记录, 本类是重置 注册表信息
 */
class PreferenceRecord @JvmOverloads constructor(val key: String, private val isRaw: Boolean = false) : EvalRecord {
    private val type = "PREFERENCE"
    val value: String?
    @Throws(Exception::class)
    override fun reset() {
        if (isRaw) {
            Preferences.userRoot().remove(key)
        } else {
            Prefs.remove(key)
        }
        Resetter.syncPrefs()
    }

    override fun toString(): String {
        return type + ": " + key + " = " + (value ?: "")
    }

    companion object {
        private val DEFAULT_VALUE: String? = null
    }

    init {
        value = if (isRaw) Preferences.userRoot()[key, DEFAULT_VALUE] else Prefs.get(key, DEFAULT_VALUE)
    }
}